/*
 * @Author: Dagon
 * @Date: 2021-02-23 09:08:21
 * @Description: 数组扁平化的几种实现方式
 */

 const arr = [1, 2, [3, 4], [5, 6, [7, 8, 9]]]
 
 // 1、递归方式
 function flat1 (arr) { 
  if (!arr.length) return;
  let res = [];
  arr.forEach(item => {
    if(Array.isArray(item)) {
      res = res.concat(flat1(item))
    } else {
      res.push(item)
    }
  });
  return res;
 }
// console.log(111, flat1(arr))
// 2、generator迭代器
function flat2 (arr) {
  return [..._flat(arr)]
}

function *_flat(arr) {
   if(Array.isArray(arr)) {
    for (const item of arr) {
      yield *_flat(item)
    }
   } else {
     yield arr
   }
}
// console.log(222, flat2(arr))

// 3、 用ladash baseFlatten 进行扁平化

// 4、用reduce 实现
function flat4(arr) {
  return arr.reduce((flat, toFlat) => {
    return flat.concat(Array.isArray(toFlat)? flat4(toFlat) : toFlat)
  }, [])
}
console.log(444, flat4(arr))
